package org.wdcode.common.tools;

import java.util.List;

/**
 * 数组帮助类
 * @author WD
 * @since JDK6
 * @version 1.0 2009-09-09
 */
public final class Arrays {
	/**
	 * 把数组转换成列表
	 * @param e 元素数组
	 * @return 元素列表
	 */
	public final static <E> List<E> toList(E... e) {
		return java.util.Arrays.asList(e);
	}

	/**
	 * 拷贝数组 已dest长度为准
	 * @param src 原数组
	 * @param dest 目标数组
	 */
	public final static <E> void copy(E[] src, E[] dest) {
		copy(src, dest, 0);
	}

	/**
	 * 拷贝数组 已dest长度为准
	 * @param src 原数组
	 * @param dest 目标数组
	 * @param pos 从第几位开始
	 */
	public final static <E> void copy(E[] src, E[] dest, int pos) {
		copy(src, pos, dest, pos, src.length);
	}

	/**
	 * 拷贝数组
	 * @param src 原数组
	 * @param srcPos 从原数组第几位开始
	 * @param dest 目标数组
	 * @param destPos 从目标组第几位开始
	 * @param length 拷贝长度
	 */
	public final static <E> void copy(E[] src, int srcPos, E[] dest, int destPos, int length) {
		System.arraycopy(src, srcPos, dest, destPos, length);
	}

	/**
	 * 把int数组包装成Integer数组
	 * @param n int数组
	 * @return Integer数组
	 */
	public final static Integer[] toInteger(int[] n) {
		// 声明Integer数组
		Integer[] t = new Integer[n.length];
		// 循环int数组
		for (int i = 0; i < n.length; i++) {
			// 辅值
			t[i] = n[i];
		}
		// 返回Integer数组
		return t;
	}

	/**
	 * 把Integer数组转换成int数组
	 * @param n Integer数组
	 * @return int数组
	 */
	public final static int[] toInt(Integer[] n) {
		// 声明Integer数组
		int[] t = new int[n.length];
		// 循环int数组
		for (int i = 0; i < n.length; i++) {
			// 辅值
			t[i] = n[i];
		}
		// 返回Integer数组
		return t;
	}

	/**
	 * 数组相加
	 * @param one 第一个数组因数
	 * @param two 第二个数组因数
	 * @return 相加后的数组
	 */
	public final static <E> E[] add(E[] one, E[] two) {
		return add(one, two, two.length);
	}

	/**
	 * 字节数组相加
	 * @param one 第一个数组因数
	 * @param two 第二个数组因数
	 * @param twoLength 第二个数组长度 一共相加多少长度
	 * @return 相加后的数组
	 */
	public final static <E> E[] add(E[] one, E[] two, int twoLength) {
		return add(one, 0, one.length, two, 0, twoLength);
	}

	/**
	 * 数组相加
	 * @param one 第一个数组因数
	 * @param onePos 第一个数组偏移 从第几个元素开始
	 * @param oneLength 第一个数组长度 一共相加多少长度
	 * @param two 第二个数组因数
	 * @param twoPos 第二个数组偏移 从第几个元素开始
	 * @param twoLength 第二个数组长度 一共相加多少长度
	 * @return 相加后的数组
	 */
	@SuppressWarnings("unchecked")
	public final static <E> E[] add(E[] one, int onePos, int oneLength, E[] two, int twoPos, int twoLength) {
		// 声明一个数组,长度是第一个和第二个数组长度的和
		E[] result = (E[]) java.lang.reflect.Array.newInstance(one.getClass().getComponentType(), oneLength + twoLength);
		// 拷贝第一个数组到和数组
		copy(one, onePos, result, 0, oneLength);
		// 拷贝第二个数组到和数组
		copy(two, twoPos, result, oneLength, twoLength);
		// 返回和数组
		return result;
	}

	/**
	 * 字节数组相加
	 * @param one 第一个数组因数
	 * @param two 第二个数组因数
	 * @return 相加后的数组
	 */
	public final static byte[] add(byte[] one, byte[] two) {
		return add(one, two, two.length);
	}

	/**
	 * 字节数组相加
	 * @param one 第一个数组因数
	 * @param two 第二个数组因数
	 * @param twoLength 第二个数组长度 一共相加多少长度
	 * @return 相加后的数组
	 */
	public final static byte[] add(byte[] one, byte[] two, int twoLength) {
		return add(one, 0, one.length, two, 0, twoLength);
	}

	/**
	 * 字节数组相加
	 * @param one 第一个数组因数
	 * @param onePos 第一个数组偏移 从第几个元素开始
	 * @param oneLength 第一个数组长度 一共相加多少长度
	 * @param two 第二个数组因数
	 * @param twoPos 第二个数组偏移 从第几个元素开始
	 * @param twoLength 第二个数组长度 一共相加多少长度
	 * @return 相加后的数组
	 */
	public final static byte[] add(byte[] one, int onePos, int oneLength, byte[] two, int twoPos, int twoLength) {
		// 声明一个数组,长度是第一个和第二个数组长度的和
		byte[] result = new byte[oneLength + twoLength];
		// 拷贝第一个数组到和数组
		System.arraycopy(one, onePos, result, 0, oneLength);
		// 拷贝第二个数组到和数组
		System.arraycopy(two, twoPos, result, oneLength, twoLength);
		// 返回和数组
		return result;
	}

	/**
	 * 获得数组
	 * @param e 要组成数据的参数
	 * @return e数组
	 */
	public final static <E> E[] getArray(E... e) {
		return e;
	}

	/**
	 * 私有构造 禁止外部实例化
	 */
	private Arrays() {}
}